package yaml

import (
	"lnzw/common/usage"
	"lnzw/engine/log"
	"os"
	"path/filepath"

	"go.uber.org/zap"
	v2 "gopkg.in/yaml.v2"
)

var config ServerConfig

// 服务端配置
type ServerConfig struct {
	// 服务器编号 如果有必要后面最好是动态生成，便于伸缩
	Id int `yaml:"id"` //服务器编号
	//服务器类型 目前定义有url gate  game  login
	// url服务器是用于分配网关服务器的，可以根据连接情况分配网关ip端口给玩家
	// gate服务器是网关服务器，每个gate服务器对应一个或多个游戏服务器，网关服务器与游戏服务器之间是长连接
	// game服务器是游戏服务器，真正处理游戏业务
	// login服务器是登录服务器，可以接入第三方sdk登录，也可以自建账号系统
	// 如果扩展针对不同类型的游戏可以新增如地图服务器，战斗服务器等等
	Type        string `yaml:"type"`  //服务器类型
	Ip          string `yaml:"ip"`    //服务器IP
	Port        int    `yaml:"port"`  //服务器端口
	RedisConfig Redis  `yaml:"redis"` //redis配置信息
	EtcdConfig  Etcd   `yaml:"etcd"`
}

// redis配置
type Redis struct {
	Ip           string `yaml:"ip"`            //ip
	Port         int    `yaml:"port"`          //端口
	Db           int    `yaml:"db"`            //数据库
	Password     string `yaml:"password"`      // 密码
	MaxIdle      int    `yaml:"max_idle"`      //最大空闲连接
	MaxActive    int    `yaml:"max_active"`    //最大活跃连接数
	ConnTimeout  int    `yaml:"conn_timeout"`  //连接超时时长(单位：秒)
	ReadTimeout  int    `yaml:"read_timeout"`  //读超时时长(单位：秒)
	WriteTimeout int    `yaml:"write_timeout"` //写超时时长(单位：秒)
}

// etcd配置
type Etcd struct {
	Endpoints   []string `yaml:"endpoints"`    //etcd地址
	DialTimeout int      `yaml:"dial_timeout"` //连接超时时长
	Username    string   `yaml:"username"`     //etcd账号
	Password    string   `yaml:"password"`     //etcd密码
}

// 初始安装配置
func Setup() {
	//获得工作目录
	workpath, _ := filepath.Split(os.Args[0])
	confpath := filepath.Join(workpath, usage.USAGE.ConfigPath)
	data, err := os.ReadFile(confpath)
	if err != nil {
		log.Logger.Error("读取配置文件失败", zap.Error(err))
		panic(err)
	}
	if err := v2.Unmarshal(data, &config); err != nil {
		log.Logger.Error("解析配置文件失败", zap.Error(err))
		panic(err)
	}
}
